/**
 * 
 */
package algo3c2g15.business;

import java.util.Date;

import algo3c2g15.domain.Ataque;
import algo3c2g15.domain.Humano;
import algo3c2g15.domain.Region;
import algo3c2g15.domain.Unidad;
import algo3c2g15.interfaces.Mortal;
import algo3c2g15.utils.*;

/**
 * @author De La
 *
 */
public abstract class Batalla {
	private static Integer expPorUnidad = new Integer(Constantes.EXP_POR_UNIDAD); 
	
	public static void atacar(Ataque ataque){
		//atacan
		for (Unidad atacante : ataque.getAtacantes()){
			//ataca... si es q tiene suerte!
			int suerte = Generador.generarEntero(1, 11, new Date().getTime());
			if (suerte > 2 && ataqueLimitrofe(atacante,ataque.getObjetivo())){
				if (ataque.getObjetivo().vivo())
					atacante.atacar(ataque.getObjetivo());
			}
			else 
				if ((atacante.getAccionesRestantes() > 0)&&(atacante.construido()))
					if (ataque.getObjetivo().vivo())
					atacante.setAccionesRestantes(atacante.getAccionesRestantes() -1);
			
		}
		//si murio reparte experiencia
		if (!ataque.getObjetivo().vivo()){
			ataque.getObjetivo().getRegionActual().removeMortal( ataque.getObjetivo() );
			Float coeficiente = new Float(1.0/ataque.getAtacantes().size());
			for (Unidad atacante : ataque.getAtacantes()){
				if (atacante.getClass() == Humano.class){
					((Humano)atacante).aumentarExperiencia(expPorUnidad*coeficiente);
				}
			}
		}
	}
	
	private static boolean ataqueLimitrofe(Unidad atacante, Mortal objetivo) {
		for (Region region : atacante.getRegionActual().getLimitrofes()) {
			if (region.getNombre() == objetivo.getRegionActual().getNombre())
				return true;
		}
		return false;
	}

	public static void atacarSinAleatoriedad(Ataque ataque){
		
			for (Unidad atacante : ataque.getAtacantes()){
				atacante.atacar(ataque.getObjetivo());
			}
			//si murio reparte experiencia
			if (!ataque.getObjetivo().vivo()){
				Float coeficiente = new Float(1.0/ataque.getAtacantes().size());
				for (Unidad atacante : ataque.getAtacantes()){
					if (atacante.getClass() == Humano.class){
						((Humano)atacante).aumentarExperiencia(expPorUnidad*coeficiente);
					}
				}
			}
		}
}

